import router from '@/router'
import store from '@/store'
import { Message } from 'element-ui'
router.beforeEach(async(to, from, next) => {
  // 定个超时时间
  const maxTime = 1000 * 60 * 60 * 2
  // 拿到刚才记住的时间
  const time = localStorage.getItem('time')
  const now = Date.now()
  // 进行判断
  if (time && now - time > maxTime) {
    // console.log('跳转页面时间', now)
    console.log('登录时间', time)
    console.log('间隔时间', now - time)
    // 当前时间减去登录时间已经超过定好的范围
    // 马上退出(记得把上次登录时间也给清理)
    localStorage.removeItem('time')
    // 提示信息
    Message.error('主动的超时，请重新登录')
    // 退出
    store.commit('user/logout')
    // 跳到登录页
    next('/login')
  }
  // to 目标地址, from 来源地址, next 放行回调函数
  // 导航守卫跟拦截器一样, 拦住了记得要放行
  next()
  const { token } = store.state.user
  //   是否有token
  if (token) {
    // 是：是否登录页
    if (to.path === '/login') {
      // 跳转到主页
      next('/')
    //   否：放过通行
    } else {
      const username = store.state.user.userInfo.username
      if (!username) {
        // 先等待个人数据拿完, 保证数据都赋值完毕了才能继续往下走
        // action 的调用本来就是 promise 只需要 async / await 即可
        await store.dispatch('user/getUserInfo')
        // 就在这个地方, 保证已经登录
        // 保证正常进入普通页面
        // 保证用户数据已经获取得到
        // 路由筛选调用 vuex
        // 上面确保了员工数据拿到, 这里传入vuex里面使用
        console.log('导航守卫进入页面之前调用筛选路由的 vuex action')
        const menus = store.state.user.userInfo.roles.menus
        // store.dispatch('permission/filterRoutes', menus)
        // 调用了actions筛选的路由，拼接了菜单
        // 还要拿到筛选的结果，追加到路由实例router里面
        // 利用router.addRouter
        const res = await store.dispatch('permission/filterRoutes', menus)
        // 来动态添加路由、子路由在添加子路由的时候用router.addRoutes
        router.addRoutes([
          ...res,
          { path: '*', redirect: '/404', hidden: true }
        ])
        next(to.path)
      }
      next()
    }
  } else {
    // 未登录跳到登录页
    // 如果你本来就是去登录页, 应该放行
    // 否则才跳到登录页

    const pathArray = ['/login', '/404', '/testpage']
    // 是否在黑名单
    if (pathArray.indexOf(to.path) !== -1) {
      // 是：放过通行
      next()
    //   否：跳转到登录页
    } else {
      next('/login')
    }
  }
})
